import store from '@/store'
import axios from 'axios'
import router from '@/router'
import qs from 'qs'
import { message } from 'ant-design-vue'
const request = axios.create({
})

function redirectLogin () {
  router.push({
    name: 'login',
    query: {
      redirect: (router.currentRoute as any).fullPath
    }
  })
}

function refreshToken () {
  // 不使用 request 否则会在拦截器处无限循环
  return axios({
    method: 'POST',
    url: '/front/user/refresh_token',
    data: qs.stringify({
      refreshtoken: store.state.user.refresh_token
    })
  })
}

let isRefresh = false // 定义是否在刷新token
let refresArr: any[] = [] // 用于保存 401 请求

request.interceptors.request.use((config) => {
  const { user } = store.state
  if (user && user.access_token) {
    // 设置token
    config.headers.Authorization = user.access_token
  }
  return config
}, err => {
  return Promise.reject(err)
})

request.interceptors.response.use((response) => {
  return response
}, async err => {
  if (err.response) {
    const { status } = err.response
    if (status === 400) {
      message.error('请求参数错误')
    } else if (status === 401) {
      // 无效的token
      if (!store.state.user) {
        redirectLogin()
        return Promise.reject(err)
      }
      if (!isRefresh) {
        isRefresh = true
        return refreshToken().then(res => {
          if (!res.data.success) {
            throw new Error('刷新 TOKEN 失败')
          }
          store.commit('setUser', res.data.content)
          // 完成 token 刷新，执行挂起的请求，并重置refresArr
          refresArr.forEach(cb => cb())
          refresArr = []
          return request(err.config)
        }).catch((err) => {
          store.commit('setUser', null)
          redirectLogin()
          return Promise.reject(err)
        }).finally(() => {
          isRefresh = false
        })
      }

      // 返回一个挂起的Promise 直到刷新完成token
      // 利用Promise来延迟执行request(err.config)
      return new Promise(resolve => {
        refresArr.push(() => {
          resolve(request(err.config))
        })
      })
    } else if (status === 403) {
      message.error('暂无权限，请联系管理员')
    } else if (status === 404) {
      message.error('请求的资源不存在')
    } else if (status >= 500) {
      message.error('服务器错误')
    }
    // 请求发出收到响应，但是状态码超出2XX范围
  } else if (err.request) {
    // 请求发出未收到响应
    message.error('请求超时')
  } else {
    // 在设置请求时发生了一些事情，触发了一个错误
    message.error(`请求失败：${err.message}`)
  }
  return Promise.reject(err)
})

export default request
